package com.yang.usb.util;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Environment;

import com.yang.usbserial.util.LogUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class FileUtil {

    private static List<byte[]> binFiles = new ArrayList<>();
    static String downloadFolderPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();

    /**
     * 读取Download文件夹下的bin文件
     */
    public static List<byte[]> readFilesFromDownloadFolder() {
        File downloadFolder = new File(downloadFolderPath);
        if (downloadFolder.exists() && downloadFolder.isDirectory()) {
            List<File> fileList = new ArrayList<>();

            File[] files = downloadFolder.listFiles();
            if (files != null) {
                for (File file : files) {
                    // 只读取bin文件类型
                    if (file.isFile() && file.getName().endsWith(".bin")) {
                        fileList.add(file);
                    }
                }
            }
            // 按文件名排序
            Collections.sort(fileList, (file1, file2) -> file1.getName().compareTo(file2.getName()));

            return readFileContents(fileList);
        } else {
            LogUtils.e("Download folder not found");
        }
        return null;
    }

    private static List<byte[]> readFileContents(List<File> fileList) {
        for (File file : fileList) {
            // 检查文件是否是bin文件
            if (file.isFile() && file.getName().toLowerCase().endsWith(".bin")) {
                // 获取文件名和文件大小
                String fileName = file.getName();
                // 在Android中，你可以使用Log来输出信息到LogCat
                LogUtils.e("File Name: " + fileName);
                LogUtils.e("File Siz: " + file.length());

                // 读取bin文件内容为字节数组
                try {
                    FileInputStream fileInputStream = new FileInputStream(file);
                    long fileSize = file.length();
                    LogUtils.e("File Size (bytes): " + fileSize);
                    byte[] fileData = new byte[(int) fileSize];
                    fileInputStream.read(fileData);
                    fileInputStream.close();

                    // 将bin文件数据添加到列表
                    binFiles.add(fileData);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return binFiles;
    }

    /**
     * 读取Assets文件夹下的bin文件
     *
     * @return
     */
    public static List<byte[]> readBinFilesFromAssets(Context context) {
        AssetManager assetManager = context.getAssets();
        List<String> fileList;

        try {
            fileList = Arrays.asList(assetManager.list("")); // 获取Assets文件夹中的所有文件名
            List<String> binNames = new ArrayList<>();

            // 筛选出以.bin结尾的文件名
            for (String file : fileList) {
                if (file.endsWith(".bin")) {
                    binNames.add(file);
                }
            }

            // 按文件名排序
            Collections.sort(binNames);

            // 读取.bin文件内容
            for (String binName : binNames) {
                InputStream in = context.getResources().getAssets().open(binName);
                long fileSize = in.available();
                LogUtils.e("File Name: " + binName);
                LogUtils.e("File Size (bytes): " + fileSize);
                byte[] fileData = new byte[(int) fileSize];
                in.read(fileData);
                in.close();

                // 将bin文件数据添加到列表
                binFiles.add(fileData);
            }

            return binFiles;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
